Предварительный анализ данных.

1. Описание признаков присутствует в сопроводительном файле. Прочитаем данные. Среди данных не может быть отрицательных значений, NA обозначаются как -999.

library(readxl)
library(dplyr)
library(tidyr)
df <- read_excel("Sleep/SLEEP_shortname.xls")
df[df < 0] <- NA

head(df)
## # A tibble: 6 × 11
##   NAME     BODY_…¹ BRAIN…² SLOWW…³ PARADOX SLEEP LIFES…⁴ GESTT…⁵ PRED_…⁶ EXP_IND
##   <chr>      <dbl>   <dbl>   <dbl>   <dbl> <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
## 1 African… 6654     5712      NA      NA     3.3    38.6     645       3       5
## 2 African…    1        6.6     6.3     2     8.3     4.5      42       3       1
## 3 Arctic …    3.38    44.5    NA      NA    12.5    14        60       1       1
## 4 Arc. gr…    0.92     5.7    NA      NA    16.5    NA        25       5       2
## 5 Asian e… 2547     4603       2.1     1.8   3.9    69       624       3       5
## 6 Baboon     10.6    180.      9.1     0.7   9.8    27       180       4       4
## # … with 1 more variable: DANG_IND <dbl>, and abbreviated variable names
## #   ¹​BODY_WEI, ²​BRAIN_WE, ³​SLOWWAVE, ⁴​LIFESPAN, ⁵​GESTTIME, ⁶​PRED_IND
## # ℹ Use `colnames()` to see all variable names

Количество строк в таблице.

nrow(df)
## [1] 62

2. Признаков немного, поэтому рассматривать будем все.

3. Кроме индексов-факторов, все признаки количественные. Индексы - порядковые признаки. Все количественные признаки непрерывные, но можно заметить дискретизацию при округлении. Проверим это, посмотрев на частоты мод.

find_mode <- function(x) {
  x <- x[!is.na(x)]
  u <- unique(x)
  tab <- tabulate(match(x, u))
  c(u[tab == max(tab)],  max(tab))
}

find_mode(df$BODY_WEI)
## [1] 0.023 3.500 2.000
find_mode(df$BRAIN_WE)
## [1] 115.0   1.0  12.3   2.0
find_mode(df$SLOWWAVE)
## [1] 11  3
find_mode(df$PARADOX)
## [1] 2.0 1.8 0.5 0.9 3.0
find_mode(df$SLEEP)
## [1] 12.5 10.3  8.4  3.0
find_mode(df$LIFESPAN)
## [1] 7 3
find_mode(df$GESTTIME)
## [1] 42 63  3

Функция выводит моды (если их несколько), потом частоту. Видно, что проблемы с округлением есть. Продолжительность периода вынашивания потомства почти полностью состоит из целых чисел, поэтому будем считать ее дискретным признаком. Остальные признаки будем считать непрерывными но с ошибками округления.

4. Не актуально для текущих данных.

5. Посмотрим на данные.

library(ggplot2)
library(GGally)
df %>% dplyr::select(-NAME) %>%
  ggpairs(diag=list(continuous = "barDiag"), 
          columns = c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))

6. Преобразуем данные. Переведем вес животного в граммы, продолжительность жизни в дни. Логарифмируем данные, чтобы было легче наблюдать корреляции (выше заметны сильно отличающиеся индивиды, это слоны). Факторизуем индексы.

dfNew <- df %>% mutate(PRED_IND = as.factor(PRED_IND), EXP_IND = as.factor(EXP_IND),
                   DANG_IND = as.factor(DANG_IND), 
                   BODY_WEI = log(BODY_WEI * 1000), BRAIN_WE = log(BRAIN_WE), 
                   LIFESPAN = log(LIFESPAN * 365.25), GESTTIME = log(GESTTIME))

Посмотрим на новые данные. Сгруппируем индивидов по факторам.

dfNew %>% dplyr::select(-NAME) %>%
  ggpairs(diag=list(continuous = "barDiag"), 
          columns = c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))

dfNew %>% dplyr::select(-NAME) %>%
  ggpairs(diag=list(continuous = "barDiag"), aes(colour=PRED_IND), legend=1,
          columns=c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))

dfNew %>% dplyr::select(-NAME) %>%
  ggpairs(diag=list(continuous = "barDiag"), aes(colour=EXP_IND), legend=1,
          columns=c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))

dfNew %>% dplyr::select(-NAME) %>%
  ggpairs(diag=list(continuous = "barDiag"), aes(colour=DANG_IND), legend=1,
          columns=c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))

7. Аутлайнеров нет.

8. Неоднородности нет.

9. Не актуально для текущих данных.

10. Используем описательные статистики для распределений признаков в новой выборке.

library(moments)
library(entropy)

Вес тела.

mean(dfNew$BODY_WEI, na.rm = TRUE)
## [1] 8.245294
quantile(dfNew$BODY_WEI, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE)
##        0%       25%       50%       75%      100% 
##  1.609438  6.387457  8.114393 10.771653 15.710729
var(dfNew$BODY_WEI, na.rm = TRUE)
## [1] 9.753926
skewness(dfNew$BODY_WEI, na.rm = TRUE)
## [1] 0.1489489
kurtosis(dfNew$BODY_WEI, na.rm = TRUE)
## [1] 2.558601

Вес мозга.

mean(dfNew$BRAIN_WE, na.rm = TRUE)
## [1] 3.140198
quantile(dfNew$BRAIN_WE, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE)
##        0%       25%       50%       75%      100% 
## -1.966113  1.442080  2.847707  5.111485  8.650325
var(dfNew$BRAIN_WE, na.rm = TRUE)
## [1] 5.985421
skewness(dfNew$BRAIN_WE, na.rm = TRUE)
## [1] 0.04451474
kurtosis(dfNew$BRAIN_WE, na.rm = TRUE)
## [1] 2.460244

Медленный сон.

mean(dfNew$SLOWWAVE, na.rm = TRUE)
## [1] 8.672917
quantile(dfNew$SLOWWAVE, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE)
##    0%   25%   50%   75%  100% 
##  2.10  6.25  8.35 11.00 17.90
var(dfNew$SLOWWAVE, na.rm = TRUE)
## [1] 13.44287
skewness(dfNew$SLOWWAVE, na.rm = TRUE)
## [1] 0.2888462
kurtosis(dfNew$SLOWWAVE, na.rm = TRUE)
## [1] 2.665648

Быстрый сон.

mean(dfNew$PARADOX, na.rm = TRUE)
## [1] 1.972
quantile(dfNew$PARADOX, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE)
##   0%  25%  50%  75% 100% 
## 0.00 0.90 1.80 2.55 6.60
var(dfNew$PARADOX, na.rm = TRUE)
## [1] 2.081241
skewness(dfNew$PARADOX, na.rm = TRUE)
## [1] 1.408774
kurtosis(dfNew$PARADOX, na.rm = TRUE)
## [1] 4.976392

Cон.

mean(dfNew$SLEEP, na.rm = TRUE)
## [1] 10.53276
quantile(dfNew$SLEEP, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE)
##    0%   25%   50%   75%  100% 
##  2.60  8.05 10.45 13.20 19.90
var(dfNew$SLEEP, na.rm = TRUE)
## [1] 21.22224
skewness(dfNew$SLEEP, na.rm = TRUE)
## [1] 0.1960028
kurtosis(dfNew$SLEEP, na.rm = TRUE)
## [1] 2.43348

Продолжительность жизни.

mean(dfNew$LIFESPAN, na.rm = TRUE)
## [1] 8.493641
quantile(dfNew$LIFESPAN, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE)
##        0%       25%       50%       75%      100% 
##  6.593729  7.790911  8.612616  9.223695 10.505752
var(dfNew$LIFESPAN, na.rm = TRUE)
## [1] 0.8902197
skewness(dfNew$LIFESPAN, na.rm = TRUE)
## [1] -0.1672212
kurtosis(dfNew$LIFESPAN, na.rm = TRUE)
## [1] 2.158602

Продолжительность периода вынашивания потомства.

mean(dfNew$GESTTIME, na.rm = TRUE)
## [1] 4.444191
quantile(dfNew$GESTTIME, probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE)
##       0%      25%      50%      75%     100% 
## 2.484907 3.575908 4.359659 5.334910 6.469250
var(dfNew$GESTTIME, na.rm = TRUE)
## [1] 1.124134
skewness(dfNew$GESTTIME, na.rm = TRUE)
## [1] 0.04858356
kurtosis(dfNew$GESTTIME, na.rm = TRUE)
## [1] 1.925085

О виде распределений и о сравнении распределений.

Индивидуальное задание 2.

1. Проверим распределения признаков на нормальность.

library(reshape)

Изобразим гистограммы признаков на фоне плотности нормального распределения.

dfMelt <- dfNew %>% 
  dplyr::select(-PRED_IND, -DANG_IND) %>% 
  as.data.frame(dfNew) %>% 
  melt(id.vars = c("NAME", "EXP_IND"))

ggplot(dfMelt, aes(x = value)) +
        geom_histogram(aes(y = ..density..)) +
        facet_wrap(~variable, scales = "free") +
        labs(x = "", y = "") +
        geom_line(aes(y = dnorm(value,
                      mean = tapply(value, variable, mean, na.rm = TRUE)[PANEL],
                      sd = tapply(value, variable, sd, na.rm = TRUE)[PANEL]
                      )), color = "blue")

Изобразим выборочную функцию распредления признаков на фоне функции распределения нормального распределения.

ggplot(dfMelt, aes(x = value)) +
        stat_ecdf() +
        facet_wrap(~variable, scales = "free") +
        labs(x = "", y = "") +
        geom_line(aes(y = pnorm(value,
                      mean = tapply(value, variable, mean, na.rm = TRUE)[PANEL],
                      sd = tapply(value, variable, sd, na.rm = TRUE)[PANEL]
                      )), color = "blue")

Давайте еще нарисуем PP-plot и QQ-plot.

library(qqplotr) 
ggplot(dfMelt, aes(sample = value)) +
        stat_pp_point(size = 1) +
        facet_wrap(~variable, scales = "free") +
        labs(x = "", y = "") +
        stat_pp_line(color = "blue")

ggplot(dfMelt, aes(sample = value)) +
        stat_qq_point(size = 1) +
        facet_wrap(~variable, scales = "free") +
        labs(x = "", y = "") +
        stat_qq_line(color = "blue")

2. Похоже, что нормальность имеет место. Проверим это с помощью критериев.

library(nortest)

У нас не так много повторений в выборке, чтобы не использовать критерий Пирсона, но все ранво проведем его, скорее, ради академического интереса. Критерий Лиллиефорса - это модификация критерия Колмогорова-Смирнова для проверки сложных гипотез нормальности данных. Критерий Андерона-Дарлинга - это один из критериев типа w^2. Критерий Шапира-Уилка - примерно квадрат корреляции между x и y в n.p.p

Вес тела.

pearson.test(dfNew$BODY_WEI)
## 
##  Pearson chi-square normality test
## 
## data:  dfNew$BODY_WEI
## P = 10.032, p-value = 0.2628
lillie.test(dfNew$BODY_WEI)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  dfNew$BODY_WEI
## D = 0.11393, p-value = 0.04414
ad.test(dfNew$BODY_WEI)
## 
##  Anderson-Darling normality test
## 
## data:  dfNew$BODY_WEI
## A = 0.34994, p-value = 0.4621
shapiro.test(dfNew$BODY_WEI)
## 
##  Shapiro-Wilk normality test
## 
## data:  dfNew$BODY_WEI
## W = 0.98645, p-value = 0.7272

Вес мозга.

pearson.test(dfNew$BRAIN_WE)
## 
##  Pearson chi-square normality test
## 
## data:  dfNew$BRAIN_WE
## P = 5.4194, p-value = 0.712
lillie.test(dfNew$BRAIN_WE)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  dfNew$BRAIN_WE
## D = 0.066897, p-value = 0.7019
ad.test(dfNew$BRAIN_WE)
## 
##  Anderson-Darling normality test
## 
## data:  dfNew$BRAIN_WE
## A = 0.27742, p-value = 0.6414
shapiro.test(dfNew$BRAIN_WE)
## 
##  Shapiro-Wilk normality test
## 
## data:  dfNew$BRAIN_WE
## W = 0.98589, p-value = 0.697

Медленный сон.

pearson.test(dfNew$SLOWWAVE)
## 
##  Pearson chi-square normality test
## 
## data:  dfNew$SLOWWAVE
## P = 3.25, p-value = 0.861
lillie.test(dfNew$SLOWWAVE)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  dfNew$SLOWWAVE
## D = 0.071335, p-value = 0.7835
ad.test(dfNew$SLOWWAVE)
## 
##  Anderson-Darling normality test
## 
## data:  dfNew$SLOWWAVE
## A = 0.1832, p-value = 0.9056
shapiro.test(dfNew$SLOWWAVE)
## 
##  Shapiro-Wilk normality test
## 
## data:  dfNew$SLOWWAVE
## W = 0.98449, p-value = 0.7704

Быстрый сон.

pearson.test(dfNew$PARADOX)
## 
##  Pearson chi-square normality test
## 
## data:  dfNew$PARADOX
## P = 11.2, p-value = 0.1301
lillie.test(dfNew$PARADOX)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  dfNew$PARADOX
## D = 0.13226, p-value = 0.02883
ad.test(dfNew$PARADOX)
## 
##  Anderson-Darling normality test
## 
## data:  dfNew$PARADOX
## A = 1.6474, p-value = 0.0002722
shapiro.test(dfNew$PARADOX)
## 
##  Shapiro-Wilk normality test
## 
## data:  dfNew$PARADOX
## W = 0.87642, p-value = 8.731e-05

Сон.

pearson.test(dfNew$SLEEP)
## 
##  Pearson chi-square normality test
## 
## data:  dfNew$SLEEP
## P = 14.448, p-value = 0.0708
lillie.test(dfNew$SLEEP)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  dfNew$SLEEP
## D = 0.063108, p-value = 0.8187
ad.test(dfNew$SLEEP)
## 
##  Anderson-Darling normality test
## 
## data:  dfNew$SLEEP
## A = 0.38848, p-value = 0.3749
shapiro.test(dfNew$SLEEP)
## 
##  Shapiro-Wilk normality test
## 
## data:  dfNew$SLEEP
## W = 0.96874, p-value = 0.1396

Продолжительность жизни.

pearson.test(dfNew$LIFESPAN)
## 
##  Pearson chi-square normality test
## 
## data:  dfNew$LIFESPAN
## P = 7.6207, p-value = 0.4714
lillie.test(dfNew$LIFESPAN)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  dfNew$LIFESPAN
## D = 0.080606, p-value = 0.458
ad.test(dfNew$LIFESPAN)
## 
##  Anderson-Darling normality test
## 
## data:  dfNew$LIFESPAN
## A = 0.49892, p-value = 0.2021
shapiro.test(dfNew$LIFESPAN)
## 
##  Shapiro-Wilk normality test
## 
## data:  dfNew$LIFESPAN
## W = 0.97581, p-value = 0.2979

Продолжительность периода вынашивания потомства.

pearson.test(dfNew$GESTTIME)
## 
##  Pearson chi-square normality test
## 
## data:  dfNew$GESTTIME
## P = 7.2414, p-value = 0.5108
lillie.test(dfNew$GESTTIME)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  dfNew$GESTTIME
## D = 0.094533, p-value = 0.2216
ad.test(dfNew$GESTTIME)
## 
##  Anderson-Darling normality test
## 
## data:  dfNew$GESTTIME
## A = 0.60367, p-value = 0.1116
shapiro.test(dfNew$GESTTIME)
## 
##  Shapiro-Wilk normality test
## 
## data:  dfNew$GESTTIME
## W = 0.96749, p-value = 0.1216

Только несколько критериев отвергли нормальность распределений признаков с уровнем значимости 0.05.

Индивидуальное задание 1.

3. Опишем разницу между животными по степени опасности места, где они спят.

dfNew %>% ggplot(aes(y=BODY_WEI, colour=EXP_IND)) + geom_boxplot()

dfNew %>% ggplot(aes(y=BRAIN_WE, colour=EXP_IND)) + geom_boxplot()

dfNew %>% ggplot(aes(y=SLOWWAVE, colour=EXP_IND)) + geom_boxplot()

dfNew %>% ggplot(aes(y=PARADOX, colour=EXP_IND)) + geom_boxplot()

dfNew %>% ggplot(aes(y=SLEEP, colour=EXP_IND)) + geom_boxplot()

dfNew %>% ggplot(aes(y=LIFESPAN, colour=EXP_IND)) + geom_boxplot()

dfNew %>% ggplot(aes(y=GESTTIME, colour=EXP_IND)) + geom_boxplot()

Можно заметить, что животные, живущие в более защищенных местах, 1,2) имеют меньший вес тела и мозга; 3,4,5) чаще дольше спят в общем и в разных фазах сна по отдельности; 6,7) имеют менее длительные продолжительность жизни и период вынашивания потомства.

Давайте проверим наблюдения 1,3) c помощью критериев для животных, живущих в ниболее и в наименее защищенных местах.

dfNew1 <- dplyr::filter(dfNew, EXP_IND == 1)
dfNew5 <- dplyr::filter(dfNew, EXP_IND == 5)

nrow(dfNew1)
## [1] 27
nrow(dfNew5)
## [1] 13

Ранее мы узнали, что многие признаки распределены нормально, но сейчас мы будем сравнивать разные группы индивидов, признаки внутри которых могут уже не имеют нормальность. Проверим это графически и критериями

ggplot(dfNew1, aes(sample = BODY_WEI)) +
        stat_qq_point(size = 1) +
        labs(x = "", y = "") +
        stat_qq_line(color = "blue")

ggplot(dfNew1, aes(sample = SLEEP)) +
        stat_qq_point(size = 1) +
        labs(x = "", y = "") +
        stat_qq_line(color = "blue")

ggplot(dfNew5, aes(sample = BODY_WEI)) +
        stat_qq_point(size = 1) +
        labs(x = "", y = "") +
        stat_qq_line(color = "blue")

ggplot(dfNew5, aes(sample = SLEEP)) +
        stat_qq_point(size = 1) +
        labs(x = "", y = "") +
        stat_qq_line(color = "blue")

Используем те же критерии, что использовали ранее.

Вес тела для животных, спящих в более защещенном месте.

pearson.test(dfNew1$BODY_WEI)
## 
##  Pearson chi-square normality test
## 
## data:  dfNew1$BODY_WEI
## P = 10.037, p-value = 0.07419
lillie.test(dfNew1$BODY_WEI)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  dfNew1$BODY_WEI
## D = 0.11889, p-value = 0.4219
ad.test(dfNew1$BODY_WEI)
## 
##  Anderson-Darling normality test
## 
## data:  dfNew1$BODY_WEI
## A = 0.42102, p-value = 0.3014
shapiro.test(dfNew1$BODY_WEI)
## 
##  Shapiro-Wilk normality test
## 
## data:  dfNew1$BODY_WEI
## W = 0.95246, p-value = 0.2459

Сон для животных, спящих в более защещенном месте.

pearson.test(dfNew1$SLEEP)
## 
##  Pearson chi-square normality test
## 
## data:  dfNew1$SLEEP
## P = 7.8462, p-value = 0.1649
lillie.test(dfNew1$SLEEP)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  dfNew1$SLEEP
## D = 0.14613, p-value = 0.1635
ad.test(dfNew1$SLEEP)
## 
##  Anderson-Darling normality test
## 
## data:  dfNew1$SLEEP
## A = 0.62141, p-value = 0.09438
shapiro.test(dfNew1$SLEEP)
## 
##  Shapiro-Wilk normality test
## 
## data:  dfNew1$SLEEP
## W = 0.93883, p-value = 0.1259

Вес тела для животных, спящих в менее защещенном месте.

pearson.test(dfNew5$BODY_WEI)
## 
##  Pearson chi-square normality test
## 
## data:  dfNew5$BODY_WEI
## P = 3.1538, p-value = 0.3685
lillie.test(dfNew5$BODY_WEI)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  dfNew5$BODY_WEI
## D = 0.1307, p-value = 0.7872
ad.test(dfNew5$BODY_WEI)
## 
##  Anderson-Darling normality test
## 
## data:  dfNew5$BODY_WEI
## A = 0.1708, p-value = 0.9112
shapiro.test(dfNew5$BODY_WEI)
## 
##  Shapiro-Wilk normality test
## 
## data:  dfNew5$BODY_WEI
## W = 0.98349, p-value = 0.9922

Сон для животных, спящих в менее защещенном месте.

pearson.test(dfNew5$SLEEP)
## 
##  Pearson chi-square normality test
## 
## data:  dfNew5$SLEEP
## P = 11.6, p-value = 0.008887
lillie.test(dfNew5$SLEEP)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  dfNew5$SLEEP
## D = 0.36483, p-value = 0.0004679
ad.test(dfNew5$SLEEP)
## 
##  Anderson-Darling normality test
## 
## data:  dfNew5$SLEEP
## A = 1.0639, p-value = 0.004763
shapiro.test(dfNew5$SLEEP)
## 
##  Shapiro-Wilk normality test
## 
## data:  dfNew5$SLEEP
## W = 0.76383, p-value = 0.00526

Нормальность отверглась с уровням значимости 0.05 толко для сная животных, спящих в менее защищенном месте. Причем по всем критериям отверглась.

Итак. Группы у нас независимые и некоторые из них имеют нормальное распределение.

4. Сравним распределения с помощью t-критериев для независимых выборок. Но сначала проверим гипотезу о равенстве дисперсий распределений.

Для веса тела можно использовать критерий Фишера, а для сна нельзя, так как для сна не выполняется нормальность, поэтому ему доверять не будем. Так же используем критерий Левена с модулями.

var.test(dfNew1$BODY_WEI, dfNew5$BODY_WEI)
## 
##  F test to compare two variances
## 
## data:  dfNew1$BODY_WEI and dfNew5$BODY_WEI
## F = 1.53, num df = 26, denom df = 12, p-value = 0.4445
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.510403 3.810906
## sample estimates:
## ratio of variances 
##           1.529963
var.test(dfNew1$SLEEP, dfNew5$SLEEP)
## 
##  F test to compare two variances
## 
## data:  dfNew1$SLEEP and dfNew5$SLEEP
## F = 5.0539, num df = 25, denom df = 9, p-value = 0.01559
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##   1.402493 13.527538
## sample estimates:
## ratio of variances 
##           5.053922
t.test(abs(dfNew1$BODY_WEI - mean(dfNew1$BODY_WEI, na.rm = TRUE)), 
       abs(dfNew5$BODY_WEI - mean(dfNew5$BODY_WEI, na.rm = TRUE)))
## 
##  Welch Two Sample t-test
## 
## data:  abs(dfNew1$BODY_WEI - mean(dfNew1$BODY_WEI, na.rm = TRUE)) and abs(dfNew5$BODY_WEI - mean(dfNew5$BODY_WEI, na.rm = TRUE))
## t = 1.0867, df = 27.477, p-value = 0.2866
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.4405109  1.4341732
## sample estimates:
## mean of x mean of y 
##  2.149804  1.652973
t.test(abs(dfNew1$SLEEP - mean(dfNew1$SLEEP, na.rm = TRUE)), 
       abs(dfNew5$SLEEP - mean(dfNew5$SLEEP, na.rm = TRUE)))
## 
##  Welch Two Sample t-test
## 
## data:  abs(dfNew1$SLEEP - mean(dfNew1$SLEEP, na.rm = TRUE)) and abs(dfNew5$SLEEP - mean(dfNew5$SLEEP, na.rm = TRUE))
## t = 3.0191, df = 31.704, p-value = 0.004973
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  0.6008402 3.0957752
## sample estimates:
## mean of x mean of y 
##  3.092308  1.244000

Гипотеза о равных дисперсиях не отверглась для веса, а для сна отверглась с уровнем значимости 0.05.

Посмотрим на t-критерии с равными и неравными дисперсиями для независимых выборок.

t.test(dfNew1$BODY_WEI, dfNew5$BODY_WEI, var.equal=TRUE, alternative="less")
## 
##  Two Sample t-test
## 
## data:  dfNew1$BODY_WEI and dfNew5$BODY_WEI
## t = -5.981, df = 38, p-value = 3.022e-07
## alternative hypothesis: true difference in means is less than 0
## 95 percent confidence interval:
##       -Inf -3.629947
## sample estimates:
## mean of x mean of y 
##  6.902725 11.957552
t.test(dfNew1$SLEEP, dfNew5$SLEEP, var.equal=TRUE, alternative="greate")
## 
##  Two Sample t-test
## 
## data:  dfNew1$SLEEP and dfNew5$SLEEP
## t = 6.6383, df = 34, p-value = 6.464e-08
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
##  6.525758      Inf
## sample estimates:
## mean of x mean of y 
##  12.94615   4.19000
t.test(dfNew1$BODY_WEI, dfNew5$BODY_WEI, var.equal=FALSE, alternative="less")
## 
##  Welch Two Sample t-test
## 
## data:  dfNew1$BODY_WEI and dfNew5$BODY_WEI
## t = -6.4484, df = 28.943, p-value = 2.368e-07
## alternative hypothesis: true difference in means is less than 0
## 95 percent confidence interval:
##       -Inf -3.722811
## sample estimates:
## mean of x mean of y 
##  6.902725 11.957552
t.test(dfNew1$SLEEP, dfNew5$SLEEP, var.equal=FALSE, alternative="greate")
## 
##  Welch Two Sample t-test
## 
## data:  dfNew1$SLEEP and dfNew5$SLEEP
## t = 9.0835, df = 33.045, p-value = 8.383e-11
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
##  7.124839      Inf
## sample estimates:
## mean of x mean of y 
##  12.94615   4.19000

Первый критерий точный, второй используется не по назначению, третий и четвертный ассимптотические. Как и предполагалось отверглись гипотезы в пользу того, что мы наблюдали на box-plot-ах выше.

5,6. Так как в случае сна удалось проверить гипотезу только асимптотическим критерием, а выборки у нас небольшие, воспользуемся непараметрическим t-критерием. А именно критерием Вилксона.

wilcox.test(dfNew1$BODY_WEI, dfNew5$BODY_WEI, alternative="less", paired=FALSE)
## Warning in wilcox.test.default(dfNew1$BODY_WEI, dfNew5$BODY_WEI, alternative =
## "less", : cannot compute exact p-value with ties
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  dfNew1$BODY_WEI and dfNew5$BODY_WEI
## W = 28, p-value = 1.092e-05
## alternative hypothesis: true location shift is less than 0
wilcox.test(dfNew1$SLEEP, dfNew5$SLEEP, alternative="greate", paired=FALSE)
## Warning in wilcox.test.default(dfNew1$SLEEP, dfNew5$SLEEP, alternative =
## "greate", : cannot compute exact p-value with ties
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  dfNew1$SLEEP and dfNew5$SLEEP
## W = 255.5, p-value = 5.015e-06
## alternative hypothesis: true location shift is greater than 0

Мощность у этого критерия меньшая, но гипотезы так же отверглись.

Наконец используем двухвыборочный критерий Колмогорова-Смирнова, который имеет меньшую мощность, но у которого более общая альтернативная гипотеза.

ks.test(dfNew1$BODY_WEI, dfNew5$BODY_WEI)
## Warning in ks.test(dfNew1$BODY_WEI, dfNew5$BODY_WEI): cannot compute exact p-
## value with ties
## 
##  Two-sample Kolmogorov-Smirnov test
## 
## data:  dfNew1$BODY_WEI and dfNew5$BODY_WEI
## D = 0.73789, p-value = 0.0001416
## alternative hypothesis: two-sided
ks.test(dfNew1$SLEEP, dfNew5$SLEEP)
## Warning in ks.test(dfNew1$SLEEP, dfNew5$SLEEP): cannot compute exact p-value
## with ties
## 
##  Two-sample Kolmogorov-Smirnov test
## 
## data:  dfNew1$SLEEP and dfNew5$SLEEP
## D = 0.86154, p-value = 4.414e-05
## alternative hypothesis: two-sided

Гипотезы так же отверглись.

7. Устное задание.

8. Не актуально для текущих данных.

Об анализе зависимостей.

Индивидуальное задание 3.

1. Посмотрим еще раз на ggpairs plot.

dfNew %>% dplyr::select(-NAME) %>%
  ggpairs(diag=list(continuous = "barDiag"), 
          columns = c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))

dfNew %>% dplyr::select(-NAME) %>%
  ggpairs(diag=list(continuous = "barDiag"), aes(colour=PRED_IND), legend=1,
          columns=c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))

dfNew %>% dplyr::select(-NAME) %>%
  ggpairs(diag=list(continuous = "barDiag"), aes(colour=EXP_IND), legend=1,
          columns=c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))

dfNew %>% dplyr::select(-NAME) %>%
  ggpairs(diag=list(continuous = "barDiag"), aes(colour=DANG_IND), legend=1,
          columns=c("BODY_WEI", "BRAIN_WE", "SLOWWAVE", "PARADOX", "SLEEP", "LIFESPAN", "GESTTIME"))

Можно заметить 1) положительную корреляцию веса тела, веса мозга, продолжительности жизни и периода вынашивания потомства; 2) положительную корреляцию фаз сна и сна в общем смысле; 3) отрицательную корреляцию всего, что было перечислено в пункте 1), со всем, что было перечислено в пункте 2).

2. Посмотрим на линейные корреляции между признаками.

dplyr::select(dfNew, -NAME) %>%
mutate(PRED_IND = as.numeric(PRED_IND), EXP_IND = as.numeric(EXP_IND), DANG_IND = as.numeric(DANG_IND)) %>%
cor(method = "pearson", use = "pairwise.complete.obs") %>%
melt() %>%
ggplot(aes(X1, X2)) +
  geom_raster(aes(fill = value)) +
  geom_text(aes(label = round(value, 3))) +
  scale_fill_gradient2(low=colors()[555], mid=colors()[1], high=colors()[26]) + 
  ggtitle("dfNew pearson") +
  theme(axis.text.x = element_text(angle = 50, hjust = 1))

Видим подтверждение того, что наблюдали на ggpairs, еще заметны отрицательные корреляции индексов и сна. То есть чем в большей опасности находиться животное, тем меньше оно спит. Еще заметна сильная корреляция между размерами животного и незащищенностью места, где оно спит.

3. Теперь посмотрим на ранговоые корреляции между признаками.

dplyr::select(dfNew, -NAME) %>%
mutate(PRED_IND = as.numeric(PRED_IND), EXP_IND = as.numeric(EXP_IND), DANG_IND = as.numeric(DANG_IND)) %>%
cor(method = "spearman", use = "pairwise.complete.obs") %>%
melt() %>%
ggplot(aes(X1, X2)) +
  geom_raster(aes(fill = value)) +
  geom_text(aes(label = round(value, 3))) +
  scale_fill_gradient2(low=colors()[555], mid=colors()[1], high=colors()[26]) + 
  ggtitle("dfNew spearman") +
  theme(axis.text.x = element_text(angle = 50, hjust = 1))

Больших изменений нет. Где-то значение корреляции стало чуть меньше, где-то чуть больше. Это связано с тем, что некоторые зависимости лучше описывабтся линейно, некоторые хуже.

4. Также посчитаем интересные частные корреляции.

library(ppcor)

Посмотрим на частную корреляцию веса животного и сна за вычетом идексов опасности.

((dplyr::select(dfNew, -NAME, -BRAIN_WE, -LIFESPAN, -GESTTIME, -SLOWWAVE, -PARADOX) %>%
  mutate(PRED_IND = as.numeric(PRED_IND), EXP_IND = as.numeric(EXP_IND), DANG_IND = as.numeric(DANG_IND)) %>%
  drop_na() %>%
  pcor(method = "spearman"))$estimate %>%
as.data.frame())["SLEEP", "BODY_WEI"]
## [1] -0.2668484
((dplyr::select(dfNew, -NAME, -BRAIN_WE, -LIFESPAN, -GESTTIME, -SLEEP, -PARADOX) %>%
  mutate(PRED_IND = as.numeric(PRED_IND), EXP_IND = as.numeric(EXP_IND), DANG_IND = as.numeric(DANG_IND)) %>%
  drop_na() %>%
  pcor(method = "spearman"))$estimate %>%
as.data.frame())["SLOWWAVE", "BODY_WEI"]
## [1] -0.2870771
((dplyr::select(dfNew, -NAME, -BRAIN_WE, -LIFESPAN, -GESTTIME, -SLOWWAVE, -SLEEP) %>%
  mutate(PRED_IND = as.numeric(PRED_IND), EXP_IND = as.numeric(EXP_IND), DANG_IND = as.numeric(DANG_IND)) %>%
  drop_na() %>%
  pcor(method = "spearman"))$estimate %>%
as.data.frame())["PARADOX", "BODY_WEI"]
## [1] -0.003219317

Посмотрим на частые корреляции индексов опасности животного и сна за вычетом веса и связанных с ним критериев.

((dplyr::select(dfNew, -NAME, -EXP_IND, -DANG_IND, -SLOWWAVE, -PARADOX) %>%
  mutate(PRED_IND = as.numeric(PRED_IND)) %>%
  drop_na() %>%
  pcor(method = "spearman"))$estimate %>% 
as.data.frame())["SLEEP", "PRED_IND"]
## [1] -0.4838444
((dplyr::select(dfNew, -NAME, -EXP_IND, -DANG_IND, -SLEEP, -PARADOX) %>%
  mutate(PRED_IND = as.numeric(PRED_IND)) %>%
  drop_na() %>%
  pcor(method = "spearman"))$estimate %>% 
as.data.frame())["SLOWWAVE", "PRED_IND"]
## [1] -0.2729752
((dplyr::select(dfNew, -NAME, -EXP_IND, -DANG_IND, -SLOWWAVE, -SLEEP) %>%
  mutate(PRED_IND = as.numeric(PRED_IND)) %>%
  drop_na() %>%
  pcor(method = "spearman"))$estimate %>% 
as.data.frame())["PARADOX", "PRED_IND"]
## [1] -0.5605862
((dplyr::select(dfNew, -NAME, -PRED_IND, -DANG_IND, -SLOWWAVE, -PARADOX) %>%
  mutate(EXP_IND = as.numeric(EXP_IND)) %>%
  drop_na() %>%
  pcor(method = "spearman"))$estimate %>% 
as.data.frame())["SLEEP", "EXP_IND"]
## [1] -0.4055336
((dplyr::select(dfNew, -NAME, -PRED_IND, -DANG_IND, -SLEEP, -PARADOX) %>%
  mutate(EXP_IND = as.numeric(EXP_IND)) %>%
  drop_na() %>%
  pcor(method = "spearman"))$estimate %>% 
as.data.frame())["SLOWWAVE", "EXP_IND"]
## [1] -0.2385904
((dplyr::select(dfNew, -NAME, -PRED_IND, -DANG_IND, -SLOWWAVE, -SLEEP) %>%
  mutate(EXP_IND = as.numeric(EXP_IND)) %>%
  drop_na() %>%
  pcor(method = "spearman"))$estimate %>% 
as.data.frame())["PARADOX", "EXP_IND"]
## [1] -0.4508023
((dplyr::select(dfNew, -NAME, -PRED_IND, -EXP_IND, -SLOWWAVE, -PARADOX) %>%
  mutate(DANG_IND = as.numeric(DANG_IND)) %>%
  drop_na() %>%
  pcor(method = "spearman"))$estimate %>% 
as.data.frame())["SLEEP", "DANG_IND"]
## [1] -0.5687154
((dplyr::select(dfNew, -NAME, -PRED_IND, -EXP_IND, -SLEEP, -PARADOX) %>%
  mutate(DANG_IND = as.numeric(DANG_IND)) %>%
  drop_na() %>%
  pcor(method = "spearman"))$estimate %>% 
as.data.frame())["SLOWWAVE", "DANG_IND"]
## [1] -0.366575
((dplyr::select(dfNew, -NAME, -PRED_IND, -EXP_IND, -SLOWWAVE, -SLEEP) %>%
  mutate(DANG_IND = as.numeric(DANG_IND)) %>%
  drop_na() %>%
  pcor(method = "spearman"))$estimate %>% 
as.data.frame())["PARADOX", "DANG_IND"]
## [1] -0.623655

Итог:

  1. Животные с большим весом спят меньше и в более опасных местах. Второе логично, потому что они не могут залеть в дупло, первое контринтуитивно, но гугл подверждает этот факт, причина его пока не известна.
  2. Животные, находящиеся в большей опасности во время сна, спят меньше, тоже логично.